/**
 * Axios基础配置和拦截器
 * 提供统一的API请求管理、认证处理和错误处理
 */

import axios from 'axios';
import { getFriendlyErrorMessage } from '@/utils/errorMessages';

// 从环境变量获取API基础URL，默认为本地开发服务器
const API_BASE_URL = import.meta.env.VITE_API_BASE_URL || 'http://localhost:3000/api/v1';

// 请求超时时间（30秒）
const REQUEST_TIMEOUT = 30000;

/**
 * 创建Axios实例
 */
const apiClient = axios.create({
  baseURL: API_BASE_URL,
  timeout: REQUEST_TIMEOUT,
  headers: {
    'Content-Type': 'application/json',
  },
});

/**
 * 请求拦截器
 * 在每个请求发送前执行
 */
apiClient.interceptors.request.use(
  (config) => {
    // 从localStorage获取token
    const token = localStorage.getItem('ai_essay_token');

    // 如果token存在，自动添加到Authorization header
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }

    // 开发模式下打印请求信息
    if (import.meta.env.DEV) {
      console.log('[API Request]', {
        method: config.method?.toUpperCase(),
        url: config.url,
        data: config.data,
        params: config.params,
      });
    }

    return config;
  },
  (error) => {
    // 请求配置错误
    console.error('[API Request Error]', error);
    return Promise.reject(error);
  }
);

/**
 * 响应拦截器
 * 在每个响应返回后执行
 */
apiClient.interceptors.response.use(
  (response) => {
    // 开发模式下打印响应信息
    if (import.meta.env.DEV) {
      console.log('[API Response]', {
        status: response.status,
        url: response.config.url,
        data: response.data,
      });
    }

    // 统一返回格式：{ success, data, message }
    // 后端API已经返回这种格式，直接返回data部分
    return response.data;
  },
  (error) => {
    // 处理响应错误
    const { response, request, message } = error;

    // 开发模式下打印错误信息
    if (import.meta.env.DEV) {
      console.error('[API Error]', {
        status: response?.status,
        url: error.config?.url,
        message: response?.data?.message || message,
        error: response?.data?.error,
      });
    }

    // 1. 处理HTTP响应错误
    if (response) {
      const { status, data } = response;

      // 401 Unauthorized - 未认证或token过期
      if (status === 401) {
        // 清除本地token和用户信息
        localStorage.removeItem('ai_essay_token');
        localStorage.removeItem('ai_essay_user');

        // 使用友好的错误提示
        const errorMessage = getFriendlyErrorMessage({ status, response });

        // 重定向到登录页（如果不在登录页）
        if (window.location.pathname !== '/login') {
          console.log('[API] 登录已过期，正在跳转到登录页');
          window.location.href = '/login';
        }

        // 返回格式化的错误
        return Promise.reject({
          type: 'AUTH_ERROR',
          message: errorMessage,
          status: 401,
        });
      }

      // 其他所有HTTP状态码 - 使用友好错误消息
      const errorMessage = data?.message || getFriendlyErrorMessage({ status, response });
      
      let errorType = 'HTTP_ERROR';
      if (status === 403) errorType = 'PERMISSION_ERROR';
      else if (status === 404) errorType = 'NOT_FOUND';
      else if (status === 409) errorType = 'CONFLICT';
      else if (status === 422) errorType = 'VALIDATION_ERROR';
      else if (status === 429) errorType = 'RATE_LIMIT_ERROR';
      else if (status >= 500) errorType = 'SERVER_ERROR';

      // 返回统一格式的错误
      return Promise.reject({
        type: errorType,
        message: errorMessage,
        status,
        details: data?.error?.details || data?.details,
      });
    }

    // 2. 处理网络错误（无响应）
    if (request) {
      // 请求已发送但没有收到响应
      const errorMessage = getFriendlyErrorMessage({ code: 'ERR_NETWORK', message });
      return Promise.reject({
        type: 'NETWORK_ERROR',
        message: errorMessage,
        status: 0,
      });
    }

    // 3. 处理其他错误（请求未发送）
    const errorMessage = getFriendlyErrorMessage({ message: message || error });
    return Promise.reject({
      type: 'UNKNOWN_ERROR',
      message: errorMessage,
      status: 0,
    });
  }
);

/**
 * 通用GET请求
 * @param {string} url - 请求URL
 * @param {Object} params - 查询参数
 * @param {Object} config - Axios配置
 * @returns {Promise} 响应数据
 */
export const get = (url, params = {}, config = {}) => {
  return apiClient.get(url, { params, ...config });
};

/**
 * 通用POST请求
 * @param {string} url - 请求URL
 * @param {Object} data - 请求体数据
 * @param {Object} config - Axios配置
 * @returns {Promise} 响应数据
 */
export const post = (url, data = {}, config = {}) => {
  return apiClient.post(url, data, config);
};

/**
 * 通用PUT请求
 * @param {string} url - 请求URL
 * @param {Object} data - 请求体数据
 * @param {Object} config - Axios配置
 * @returns {Promise} 响应数据
 */
export const put = (url, data = {}, config = {}) => {
  return apiClient.put(url, data, config);
};

/**
 * 通用PATCH请求
 * @param {string} url - 请求URL
 * @param {Object} data - 请求体数据
 * @param {Object} config - Axios配置
 * @returns {Promise} 响应数据
 */
export const patch = (url, data = {}, config = {}) => {
  return apiClient.patch(url, data, config);
};

/**
 * 通用DELETE请求
 * @param {string} url - 请求URL
 * @param {Object} config - Axios配置
 * @returns {Promise} 响应数据
 */
export const del = (url, config = {}) => {
  return apiClient.delete(url, config);
};

/**
 * 文件上传请求
 * @param {string} url - 请求URL
 * @param {FormData} formData - 表单数据
 * @param {Function} onUploadProgress - 上传进度回调
 * @returns {Promise} 响应数据
 */
export const upload = (url, formData, onUploadProgress) => {
  return apiClient.post(url, formData, {
    headers: {
      'Content-Type': 'multipart/form-data',
    },
    onUploadProgress,
  });
};

// 导出axios实例（用于高级用法）
export default apiClient;

